package d0524_io案例;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

/**
 * 管理类
 */
// 抑制告警
@SuppressWarnings("unchecked")
public class StudentManager {

	//private Set<Student> set = new LinkedHashSet<>();
	// 使用排序Set集合 ==> TreeSet
	private Set<Student> set = new TreeSet<>();

	/**
	 * 读入学生信息的时机
	 * 	1. 构造函数
	 * 	2. 块(实例块 or 静态块)
	 * 	3. 单独执行某个方法加载
	 */
	{
		// 实例块  => 无名构造函数

		try (FileInputStream fis = new FileInputStream("d:/stus.dat"); // 资源流
				ObjectInputStream ois = new ObjectInputStream(fis); // 处理流(缓冲流)
		// 不需要手动关闭流, JDK 会在 try 之后自动关闭流
		) {
			set = (Set<Student>) ois.readObject(); // 告警
		} catch (FileNotFoundException e) {
			System.out.println("第一次运行,数据文件不存在!");
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// 类型转换异常
			e.printStackTrace();
		}
	}

	/**
	 * 注册 : 新增学生
	 */
	public void reg(Student student) {
		set.add(student);
		// 将java对象保存到文件中 : 1. DataOutputStream  2. ObjectOutputStream

		ObjectOutputStream oos = null; // 处理流(缓冲流)
		FileOutputStream fos = null; // 资源流
		try {
			fos = new FileOutputStream("d:/stus.dat");
			oos = new ObjectOutputStream(fos); // 装饰器设计模式  23种设计模式
			oos.writeObject(set);

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (fos != null)
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			if (oos != null)
				try {
					oos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}

	}

	/**
	 * 查询所有的学生
	 */
	public void show() {
		for (Student student : set) {
			System.out.println(student); // student.toString();
		}
	}

	/**
	 * 根据姓名查询
	 * 	模糊查询   :  张三    张
	 * @param name
	 */
	public void show(String name) {
		for (Student student : set) {
			if (student.getName().contains(name)) {
				// if(student.getName().indexOf(name) > -1 ) {
				System.out.println(student); // student.toString();
			}
		}
	}

	/**
	 * 根据起止日期查询生日
	 * @param start
	 * @param end
	 */
	public void show(Date start, Date end) {
		for (Student student : set) {
			if (student.getBirthday().after(start) && student.getBirthday().before(end)) {
				System.out.println(student); // student.toString();
			}
		}
	}

	public static void main(String[] args) {

		/**
		 * 扩展: 如何在show 的显示的是 按 sn 排序的结果
		 * 		set 定义为 treeset
		 * 		student 实现 comparable接口
		 */

		StudentManager sm = new StudentManager();
		/**
		 * 删除源文件夹, 重新写入新的数据
		 */
		/*sm.reg(new Student("001", "武松", new Date(year()), "1234567"));
		sm.reg(new Student("002", "李逵", new Date(year()), "1234567"));
		sm.reg(new Student("006", "李鬼", new Date(year()), "1234567"));
		sm.reg(new Student("003", "周通", new Date(year()), "1234567"));
		sm.reg(new Student("004", "李忠", new Date(year()), "1234567"));
		sm.reg(new Student("005", "曹正", new Date(year()), "1234567"));*/

		//sm.show("忠");
		sm.show();

		System.out.println("============= 生日查询 =============");
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		try {
			Date start = sdf.parse("1980-01-01");
			Date end = sdf.parse("2021-06-01");
			sm.show(start, end);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		/**
		 * 实现菜单功能
		 */
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("*****************");
			System.out.println("*    1. 注册                 *");
			System.out.println("*    2. 查询全部          *");
			System.out.println("*    3. 日期查询                 *");
			System.out.println("*    4. 删除                 *");
			System.out.println("*****************");
			System.out.print("请输入:");
			int i = sc.nextInt();
			// 读掉上一行读入的换行
			sc.nextLine();
			if (i == 1) {
				// 注册
				try {
					System.out.print("请输入学号");
					String sn = sc.nextLine(); // 读入整行
					System.out.print("请输入姓名");
					String name = sc.nextLine(); // 读入整行
					System.out.print("请输入生日");
					String birthdayStr = sc.nextLine(); // 读入整行
					System.out.print("请输入QQ");
					String qq = sc.nextLine(); // 读入整行
					Date birthday;
					birthday = sdf.parse(birthdayStr);
					Student stu = new Student(sn, name, birthday, qq);
					sm.reg(stu);
				} catch (ParseException e) {
					System.out.println("日期格式错误!");
				}
			} else if (i == 2) {
				sm.show();
			} else if (i == 3) {
				try {
					System.out.print("请输入开始生日");
					String s1 = sc.nextLine();
					System.out.print("请输入截至生日");
					String s2 = sc.nextLine();
					Date d1 = sdf.parse(s1);
					Date d2 = sdf.parse(s2);
					sm.show(d1, d2);
				} catch (ParseException e) {
					System.out.println("日期格式错误!");
				}

			} else if (i == 4) {
				System.out.print("请输入要删除的学生的学号");
				String s1 = sc.nextLine();
				// list 有 get 方法 可以使用 普通 for 循环
				// set 没有 get 方法  只能使用迭代器循环
				// 如果在迭代器循环中删除集合元素, 不能使用集合的remove方法
				Iterator<Student> it = sm.set.iterator();
				while(it.hasNext()) {
					Student s = it.next();
					if(s1.equals(s.getSn())) {
						// 删除元素使用迭代器提供删除方法
						it.remove();
						break;
					}
				}
			}

		}

	}

	public static long year() {
		long time = System.currentTimeMillis();//
		long y100 = 1000L * 60L * 60L * 24L * 365L * 100L;
		y100 = (long) (new Random().nextDouble() * y100);
		time -= y100;
		return time;
	}

}
